package com.tedu.api.io;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Random;

/**
 * RandomAccessFile
 * 专门解决File无法读写的操作类【传输数据】，底层使用C完成
 *【使用方法并不方便】---知道
 * RandomAccessFile构造器使用
 * RandomAccessFile方法的使用：读，写操作
 * 需求：实现音乐 C V 复制 粘贴
 */
public class RandomAccessFileAPI {
@Test
    public void testWrite() throws IOException {
      //创建RAF类: 在API 项目文件下 直接创建raf.txt文件，模式 读 写
       RandomAccessFile raf=
  new RandomAccessFile("raf.txt","rw");
    /**
     * write()
     * 作用：写出一个字节，将给定的int值对应2进制的“低8位”写出
     * 该方法有异常，范围：0~255之间---写入ASCII码【接近】
     * 出现异常:抛出IO异常--有可能存在文件无法写出的情况
     */
    raf.write(97);//a
    raf.write(98);
    raf.write(101);
    //关闭 流     closed()
    raf.close();
  }

  @Test
    public void testRead() throws IOException {
    //创建RAF类---模式： r
      RandomAccessFile raf=
          new RandomAccessFile("raf.txt","r");
      /**
       * read()
       * 作用：读取一个字节，返回10进制值，如果返回值-1，代表读取末尾
       * 抛出IO异常
       */
    int a=raf.read();
    int b=raf.read();    int e=raf.read();
    int c=raf.read();
      System.out.println("读取到"+a+""+b+""+e+""+c);
  }

  //需求：实现音乐C V 复制 粘贴
    @Test
    public void testCopy() throws IOException {
         //被复制的文件--复制操作
        RandomAccessFile src=
                new RandomAccessFile("复制文件.mp4","r");
         //复制出来的文件--粘贴操作---模式：rw
        RandomAccessFile desc=
                new RandomAccessFile("复制品.mp4","rw");

        //2.创建变量类型：int类型--①用于保存读取/写出的每个字节
        int temp=-1; //读取：②读到-1代表文件数据读完了
        //5.【一个字节一个字节读---一个字节一个字节写】测运行效率
        long start=System.currentTimeMillis();//获取系统时间
        //6.关闭流
        src.close();desc.close();
        //7.读取花费时间
        long end=System.currentTimeMillis();
        System.out.println("读取花费时间"+(end-start)+"秒数");
        //3.从”小跳蛙.mp3“ --读到的每个字节--写出”新跳蛙.mp3“
        //思考：一直从"小跳蛙.mp3"读到所有字节
        //从"小跳蛙.mp3"读到所有字节，只要不是末尾 ！=-1 一直读
        while( (temp=src.read())!=-1){   //如果有数据：true
       //4.写出【新跳蛙.mp3】每个字节
                     desc.write(temp); //读入temp数据写出write中
        }
    }

    /**
     * 读写按照一个字节操作--效率低
     *
     * 1024 程序员节
     * 1字节=8位二进制
     * 0    0000 0000
     * 1    0000 0001
     * 2    0000 0010
     * 6    0000 0110
     * 1024字节
     * 1024KB1MB
     * 1024MB=1G
     * 1024G=1T
     * 读写按照100个字节操作---效率低
     */
    @Test
    public void testRW() throws IOException {
    //1.被复制的文件--视频--占用内存空间大
    RandomAccessFile src=
    new RandomAccessFile("复制文件.mp4","r");
    //1.复制的文件--视频.MP4
    RandomAccessFile desc=
    new RandomAccessFile("视频.mp4","rw");
    //2.保存每次读取的字节量
     int len=-1;
        /**重载
         * read() 一个字节一个字节读
         * read(字节数组)实现根据自己指定的 100KB 方式读取字节
         */
     //3.定义字节数组---100KB
        byte[] data=new byte[1024*100];
     //4.开始一直从“复制文件.mp4”读取
     //src.read(data)!=-1
     while((len=src.read(data))!=-1){
/**重载
 * write(int i)写出一个字节
 * write(字节数组,读取开始：0,读取结束：-1)
 * 作用：写出字节数组：指定大小
 *    从0开始，写出到-1结束
 */
//5.按照100KB 写出文件
         desc.write(data,0,len);
//6.关闭流
//7.自己测复制的时间
     }
    }
}
